﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid;
using DevExpress.XtraReports.UI;
using DevExpress.XtraSplashScreen;

using prjKQXS_UI.View;
using prjKQXS_DLL;
using prjKQXS_DLL.Truyen_thong;
using prjKQXS_Report.Truyen_thong;

namespace prjKQXS_UI.Truyen_thong
{
    public partial class frmNhapVeHuy_CB : DevExpress.XtraEditors.XtraForm
    {
        private bool isLoad = false;
        private int focusRow = 0;
        public int GiaVe = 0;
        public string KyHieu = "";

        clsHuyVe cls = new clsHuyVe();

        /// <summary>
        /// Giá trị biến này tự động được gán là '%' khi chọn tất cả hoặc là mã đơn vị tương ứng khi chọn cán bộ từ lueDonVi
        /// </summary>
        char MaDV = '%';

        /// <summary>
        /// TenDV (Tên đơn vị) tự động được gán khi chọn đơn vị từ lueDonVi
        /// </summary>
        string TenDV;

        #region Form =============================================================================
        public frmNhapVeHuy_CB()
        {
            InitializeComponent();
            ucDonVi1.lueDonVi.EditValueChanged += new EventHandler(lueDonVi_EditValueChanged);
            ucDonVi1.lueDonVi.KeyDown += new KeyEventHandler(lueDonVi_KeyDown);
            cls.OnAction += new clsHuyVe.OnActionHandler(cls_OnAction);
            cls.OnError += new clsHuyVe.OnErrorHandler(cls_OnError);
        }

        private void frmNhapVeHuy_CB_Shown(object sender, EventArgs e)
        {
            deNgay.DateTime = BienTc.denngay;
            gvCanBo.OptionsBehavior.Editable = deNgay.DateTime.Date == DateTime.Now.Date; 
            loadLueDonVi();
            ucDonVi1.lueDonVi.Focus();

            if (BienTc.isQuanHuyen || BienTc.isThanhPho || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.L_DonVi))
            {
                ucDonVi1.lueDonVi.ItemIndex = ucDonVi1.lueDonVi.Properties.GetDataSourceRowIndex("Ma_DT", BienTc.ma_huyen == "" ? "TC" : BienTc.ma_huyen);
                if (BienTc.isQuanHuyen || BienTc.isThanhPho) ucDonVi1.lueDonVi.Properties.ReadOnly = true;
            }
            else ucDonVi1.lueDonVi.ItemIndex = 0;

            if (BienTc.isQuanHuyen || BienTc.isThanhPho || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_XoaVeHuyCB))
                //sbtnXoaVeHuy.Visible = false;
                sbtnInTongHop.Enabled = false;
            //sbtnInTongHop.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_InTongHopCanBoHuyVe);
            sbtnInChiTiet.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_InChiTietCanBoHuyVe);
            sbtnChuyenVe.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_ChuyenVeHuyCanBo);
        }
        #endregion Form ==========================================================================


        #region Control ==========================================================================
        private void lueDonVi_EditValueChanged(object sender, EventArgs e)
        {
            string madv = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString().Trim();
            MaDV = madv == "TC" ? '%' : Convert.ToChar(madv);
            TenDV = ucDonVi1.lueDonVi.GetColumnValue("Ten_DT").ToString().Trim();

            if (MaDV != '%')
            {
                Taosoluongvecb(madv, deNgay.DateTime);
                updategiatridv2(BienTc.GiaVe, BienTc.KyHieuVe, madv, deNgay.DateTime);
            }

            LoadData();
        }

        private void lueDonVi_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) gvCanBo.Focus();
        }

        //Thủ tục này và sbtnInTongHop bên đại lý là giống nhau (chỉ khác nhau tham số truyền vào là "_CB")
        private void sbtnInChiTiet_Click(object sender, EventArgs e)
        {
            string madv = gvDonVi.GetFocusedRowCellValue("MaDV").ToString().Trim();
            if (!string.IsNullOrEmpty(madv))
            {
                rptTongHopTT rpt = new rptTongHopTT(); 
                rpt.dtSource = cls.rptTongHopTT(Convert.ToChar(madv), deNgay.DateTime, deNgay.DateTime, ref rpt.TyLe, "_CB");
                rpt.Parameters["pNgayMoThuong"].Value = deNgay.DateTime.Date;
                rpt.Parameters["pMaDV"].Value = madv;
                rpt.Parameters["pTenDV"].Value = gvDonVi.GetFocusedRowCellValue("TenDV");
                rpt.Parameters["pKyHieu"].Value = KyHieu;
                rpt.ShowRibbonPreviewDialog();
            }
            else
                XtraMessageBox.Show("Không in được,bạn hãy xem lại các thông tin cần in ./.", "Lỗi không in", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        //Thủ tục này và sbtnIn bên công ty là giống nhau
        private void sbtnInTongHop_Click(object sender, EventArgs e)
        {
            rptTongHopTT_DV rpt = new rptTongHopTT_DV();
            rpt.dtSource = cls.rptTongHop_CB('%', deNgay.DateTime, deNgay.DateTime, ref rpt.TyLe, ref rpt.VietBangSo);
            rpt.xrtcGiaVe.Text = GiaVe.ToString("#,#đ");
            rpt.xrtcKyHieu.Text = KyHieu;
            rpt.pNgay.Value = deNgay.DateTime.Date;
            rpt.ShowRibbonPreviewDialog();
        }

        private void btnTim_Click(object sender, EventArgs e)
        {
            if (btnTim.Tag.Equals("LOC"))
            {
                btnTim.Tag = "BL";
                btnTim.Text = "F5. &Bỏ tìm";
                gvCanBo.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvCanBo.OptionsView.ShowAutoFilterRow = false;
                btnTim.Tag = "LOC";
                btnTim.Text = "F5. &Tìm";
                gvCanBo.ClearColumnsFilter();
            }
        }

        //Chuyển vé từ máy đơn vị về máy chủ công ty
        private void sbtnChuyenVe_Click(object sender, EventArgs e)
        {
            /*
             * B1: Xóa vé hủy vào @Ngay của đơn vị A tại máy chủ.
             * B2: Chuyển vé hủy đơn vị A vào @Ngay từ đơn vị về máy chủ.
             */

            bool ok = false;

            try
            {

                SplashScreenManager.ShowForm(typeof(frmWaitForm));

                SqlConnection connCONGTY = new SqlConnection(clsCommon.getServerConnectionString());
                SqlConnection connDONVI = new SqlConnection(BienTc.connString);
                connCONGTY.Open();
                connDONVI.Open();

                //string madv = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString().Trim();

                #region B1: Xóa vé hủy vào @Ngay của đơn vị A tại máy chủ.
//                string sql = @"DELETE T
//                            FROM tblVESO_CB T INNER JOIN vDMCANBO C ON T.DMCanBoID = C.ID
//                            WHERE NgayMoThuong = @Ngay
//                                and Ma_DMDonVi = @MaDV";
                if (System.Configuration.ConfigurationSettings.AppSettings["queryxoadlMayChu"] != null)
                {
                    var sql = System.Configuration.ConfigurationSettings.AppSettings["queryxoadlMayChu"];
                    var cmd = new SqlCommand(sql, connCONGTY);
                    cmd.Parameters.AddWithValue("@Ngay", deNgay.DateTime.Date);
                    cmd.Parameters.AddWithValue("@MaDV", MaDV.ToString());cmd.ExecuteNonQuery();
                    #endregion ------------------------------------------------

                    #region B2: Chuyển vé hủy vào @Ngay từ đơn vị A về máy chủ.

                    sql = @"SELECT T.*
                    FROM tblVESO_CB T INNER JOIN vDMCANBO C ON T.DMCanBoID = C.ID
                    WHERE T.isPublic = 1 and C.isPublic = 1
                        and NgayMoThuong = @Ngay
                        and Ma_DMDonVi = @MaDV";
                    SqlDataAdapter da = new SqlDataAdapter(sql, connDONVI);
                    da.SelectCommand.Parameters.AddWithValue("@Ngay", deNgay.DateTime.Date);
                    da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV.ToString());
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    foreach (DataRow dr in dt.Rows)
                    {
                        sql =
                            @"INSERT INTO tblVESO_CB(DMCanBoID, NgayMoThuong, SLVeNhan, SLVeHuy, Giave, Kyhieu, isPublic)
                        VALUES(@DMCanBoID, @NgayMoThuong, @SLVeNhan, @SLVeHuy, @Giave, @Kyhieu, 1)";
                        cmd = new SqlCommand(sql, connCONGTY);
                        cmd.Parameters.AddWithValue("@DMCanBoID", dr["DMCanBoID"]);
                        cmd.Parameters.AddWithValue("@NgayMoThuong", dr["NgayMoThuong"]);
                        cmd.Parameters.AddWithValue("@SLVeNhan", dr["SLVeNhan"]);
                        cmd.Parameters.AddWithValue("@SLVeHuy", dr["SLVeHuy"]);
                        cmd.Parameters.AddWithValue("@Giave", dr["Giave"]);
                        cmd.Parameters.AddWithValue("@Kyhieu", dr["Kyhieu"]);
                        cmd.ExecuteNonQuery();
                    }
                }

                #endregion ------------------------------------------------

                ok = true;
            }
            catch (SqlException ex)
            {
                cls_OnAction(ex);
            }
            catch (Exception ex)
            {
                cls_OnError(ex);
            }
            finally
            {
                SplashScreenManager.CloseForm();
                if (ok) XtraMessageBox.Show("Chuyển vé hủy thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else XtraMessageBox.Show("Chuyển vé hủy không thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void sbtnXoaVeHuy_Click(object sender, EventArgs e)
        {
            if (MaDV != '%')
            {
                if (clsCommon.MsgBox("Bạn có chắc chắn muốn xóa vé hủy của đơn vị " + TenDV, 4) == DialogResult.Yes)
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();
                    string sql = "delete tblVESO_CB from tblVESO_CB VS inner join DMCANBO CB ON VS.DMCanBoID = CB.ID where Ma_DMDonVi like @MaDV and NgayMoThuong = @NgayMoThuong";
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddWithValue("@MaDV", MaDV);
                    cmd.Parameters.AddWithValue("@NgayMoThuong", deNgay.DateTime.Date);
                    cmd.ExecuteNonQuery();
                    LoadData();
                }
            }
            else clsCommon.MsgBox("Bạn phải chọn đơn vị trước!", 5);
        }
        #endregion Control =======================================================================


        #region Sub and Func =====================================================================
        #region cls event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion cls event -----------------------------------------

        private void Taosoluongvecb(string MaDV, DateTime Ngay)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();

            string sql = @"Select CB.ID AS DMCanBoID
                            FROM  vDMCANBO CB
                            where CB.isPublic = 1
                                and Ma_DMDonVi = @MaDV
                                and CAST(CASE WHEN CB.Ngay_ThanhLy IS NULL THEN '0' ELSE '1' END AS bit) = 0
                                and Right(rtrim(CB.Ma_DT),1) <> 'P'
                                and Right(rtrim(CB.Ma_DT),1) <> 'T'
                                and Right(rtrim(CB.Ma_DT),1) <> 'D'
                                and CB.ID not in (
			                            Select VS.DMCanBoID
                                        FROM  tblVESO_CB VS INNER JOIN vDMCANBO ON vDMCANBO.ID = VS.DMCanBoID
			                            WHERE vDMCANBO.isPublic = 1 and VS.isPublic = 1
                                            and NgayMoThuong = @Ngay 
		                            )
		                    ORDER BY CB.Ma_DT";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
            da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
            DataTable dtCANBO = new DataTable();
            da.Fill(dtCANBO);

            SqlCommand cmd = null;
            foreach (DataRow dr in dtCANBO.Rows)
            {
                cmd = new SqlCommand("INSERT INTO tblVESO_CB(DMCanBoID, NgayMoThuong) VALUES(@DMCanBoID, @NgayMoThuong)", conn);
                cmd.Parameters.AddWithValue("@DMCanBoID", dr["DMCanBoID"]);
                cmd.Parameters.AddWithValue("@NgayMoThuong", Ngay);
                cmd.ExecuteNonQuery();
            }
        }

        private void loadLueDonVi()
        {
            ucDonVi1.lueDonVi.Properties.DataSource = clsCommon.load_lueDonVi();
            ucDonVi1.lueDonVi.ItemIndex = 0;
        }

        private void LoadData()
        {
            gcCanBo.DataSource = Loadvesocb(deNgay.DateTime);
            gcDonVi.DataSource = Loadvesohuydv(deNgay.DateTime);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="Ngay"></param>
        /// <returns></returns>
        private DataTable Loadvesocb(DateTime Ngay)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            DataTable dt = new DataTable();

            string sql = @"SELECT VS.ID
                                , CB.ID AS DMCanBoID
	                            , CB.Ma_DT AS MaCB
                                , CB.Ten_DT AS TenCB
                                , SLVeNhan
                                , SLVeHuy
                                , ( CASE WHEN SLVeNhan is null and SLVeHuy is null THEN null
                                         ELSE (CASE WHEN SLVeNhan is null THEN 0 ELSE SLVeNhan END - CASE WHEN SLVeHuy is null THEN 0 ELSE SLVeHuy END)
                                    END) AS SLVeBan
                            FROM  tblVESO_CB VS INNER JOIN vDMCANBO CB ON CB.ID = VS.DMCanBoID
                            WHERE CB.isPublic = 1 and VS.isPublic = 1 
                                and Ma_DMDonVi like @MaDV
                                and NgayMoThuong = @Ngay
                            Order by CB.Ma_DT";

            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
            da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
            da.Fill(dt);

            return dt;
        }

        private DataTable Loadvesohuydv(DateTime Ngay)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            DataTable dt = new DataTable();
            string sql = @"Select Ma_DMDonVi as MaDV
                            , TenDV
                            , Sum(SLVeNhan) as SLVeNhan
                            , Sum(SLVeHuy) as SLVeHuy
                            , (Sum(Case when SLVeNhan is NULL then 0 else SLVeNhan end) 
                                - Sum(Case when SLVeHuy is NULL then 0 else SLVeHuy end)) as SLVeBan 
                        FROM vVESO VS 
                        Where VS.isPublic = 1
							and NgayMoThuong = @Ngay
                            and Ma_DMDonVi like @MaDV
                        group by Ma_DMDonVi
                            , TenDV
                        order by Ma_DMDonVi";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
            da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
            da.Fill(dt);

            return dt;
        }

        private int updategiatridv2(object giave, object kyhieu, string ma, DateTime ngay)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                conn.Open();
                string sql = @"UPDATE tblVESO_CB SET Giave = @Giave, Kyhieu = @Kyhieu
                                FROM  tblVESO_CB VS INNER JOIN vDMCANBO CB ON CB.ID = VS.DMCanBoID
                                WHERE CB.isPublic = 1 and VS.isPublic = 1
                                    and Ma_DMDonVi = @Madv 
	                                and NgayMoThuong = @Ngay";
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@Giave", giave);
                cmd.Parameters.AddWithValue("@Kyhieu", kyhieu);
                cmd.Parameters.AddWithValue("@Madv", ma);
                cmd.Parameters.AddWithValue("@Ngay", ngay);
                return cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                clsCommon.MsgBox("Có lỗi xảy ra, vui lòng kiểm tra lại !\n" + ex.Message, 0);
                return 0;
            }
            finally
            {
                conn.Close();
            }
        }

        private void Anf2()
        {
            gvCanBo.Focus();
            gvCanBo.OptionsBehavior.Editable = true;
            gridColumn3.OptionsColumn.AllowFocus = false;
            gridColumn3.OptionsColumn.AllowEdit = false;
            gridColumn6.OptionsColumn.AllowFocus = true;
            gridColumn6.OptionsColumn.AllowEdit = true;
            gvCanBo.FocusedRowHandle = 0;
            gvCanBo.FocusedColumn = gvCanBo.Columns["SLVeNhan"];
        }

        private void Anf3()
        {
            gvCanBo.Focus();
            gvCanBo.OptionsBehavior.Editable = true;
            gridColumn3.OptionsColumn.AllowFocus = true;
            gridColumn3.OptionsColumn.AllowEdit = true;
            gridColumn6.OptionsColumn.AllowFocus = false;
            gridColumn6.OptionsColumn.AllowEdit = false;
            gvCanBo.FocusedRowHandle = 0;
            gvCanBo.FocusedColumn = gvCanBo.Columns["SLVeHuy"];
        }

        private void Anf4()
        {
            gvCanBo.Focus();
            gvCanBo.OptionsBehavior.Editable = true;
            gridColumn6.OptionsColumn.AllowFocus = true;
            gridColumn6.OptionsColumn.AllowEdit = true;
            gridColumn3.OptionsColumn.AllowFocus = true;
            gridColumn3.OptionsColumn.AllowEdit = true;
            gvCanBo.FocusedRowHandle = 0;
            gvCanBo.FocusedColumn = gvCanBo.Columns["SLVeNhan"];
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F2)
            {
                Anf2();
            }
            if (keyData == Keys.F3)
            {
                Anf3();
            }
            if (keyData == Keys.F4)
            {
                Anf4();
            }
            else if (keyData == Keys.F7)
            {
                sbtnInTongHop_Click(null, null);
            }
            else if (keyData == Keys.F8)
            {
                this.Close();
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
        #endregion Sub and Func ==================================================================


        #region gv ===============================================================================
        private void gvCanBo_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (e.Column.FieldName.ToUpper() == "SLVENHAN" || e.Column.FieldName.ToUpper() == "SLVEHUY")
            {
                int i = 0, i1 = 0;
                if (clsTruyenThong.DaNhapVesoRoi('B', deNgay.DateTime, MaDV.ToString()))
                {
                    XtraMessageBox.Show("Không nhập được ở đây vì chi tiết đã nhập bên đại lý hoặc công ty rồi");
                }
                else
                {
                    clsCommon.updateRowValue("tblVESO_CB", e.Column.FieldName.ToUpper(), "Where ID = " + gvCanBo.GetFocusedDataRow()["ID"].ToString(), e.Value);

                    object o = clsCommon.getCellValue("tblVESO_CB", "SLVeNhan", "Where ID=" + gvCanBo.GetFocusedDataRow()["ID"].ToString());
                    object o1 = clsCommon.getCellValue("tblVESO_CB", "SLVeHuy", "Where ID=" + gvCanBo.GetFocusedDataRow()["ID"].ToString());

                    i = o.ToString().Trim() == "" ? 0 : (int)o;
                    if (e.Column.FieldName.ToUpper() == "SLVEHUY") i1 = o1.ToString().Trim() == "" ? 0 : (int)o1;

                    if (i < i1)
                        clsCommon.MsgBox("Số lượng vé hủy không thể lớn hơn số lượng vé nhận. Hãy sửa lại số lượng vé cho đúng với thực tế", 0);
                    else isLoad = true;

                    gcDonVi.DataSource = Loadvesohuydv(deNgay.DateTime);
                    isLoad = false;
                    gvDonVi.FocusedRowHandle = focusRow;
                }

                if (i+i1 > 0) gvCanBo.SetFocusedRowCellValue("SLVeBan", i - i1);
            }
        }

        private void gvCanBo_CellValueChanging(object sender, CellValueChangedEventArgs e)
        {
            string a = e.Value.ToString();
            if (a.ToString().Length != 0)
            {
                foreach (char c in a)
                {
                    if (!char.IsDigit(c))
                        clsCommon.MsgBox("Bạn phải nhập giá trị là số ", 0);
                }
            }
        }

        private void gvDonVi_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e)
        {
            if (e.Value.ToString().Length == 0)e.Value = 0;
        }

        private void gvCanBo_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void gvCanBo_LostFocus(object sender, EventArgs e)
        {
            LoadData();
        }

        private void gvDonVi_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
            if (!isLoad)
            {
                focusRow = e.FocusedRowHandle;
            }
        }
        #endregion gv ============================================================================

        private void btndong_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}